<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<TITLE>EV3Basic Developer Manual</TITLE>
<style type="text/css">
  H1.chapter {
	margin-top: 100px;
    font-family: Verdana; 
  }
  H3.subchapter {
    font-family: Verdana; 
  }
  P {
    font-family: Verdana; 
  }
  UL {
    font-family: Verdana; 
  }
  ADDRESS {
    font-family: Verdana; 
	float: right;
  }
  TABLE {
    font-family: Verdana;
	border-spacing: 0px;
	border:1px solid black;
  }
  TD {
	padding: 4px;
	border:1px solid black;
  }
  TR:nth-child(1)
  {
	background: #d0d0d0;
  } 

  H2.object {
    font-family: Verdana; 
	border-bottom: medium solid;
  }
  P.objectsummary {
    font-family: Verdana; 
  }
  H3.operation {
    font-family: Verdana;  
	margin-top: 20px;
	margin-bottom: 10px;
	margin-left: 20px; 
  }
  P.operationsummary {
    font-family: Verdana; 
	margin-top: 10px;
	margin-bottom: 10px;
	margin-left: 20px; 
  }
  H3.property {
    font-family: Verdana;  
	margin-top: 20px;
	margin-bottom: 10px;
	margin-left: 20px; 
  }
  P.propertysummary {
    font-family: Verdana; 
	margin-top: 10px;
	margin-bottom: 10px;
	margin-left: 20px; 
  }
  H4.parameter {
    font-family: Verdana; 
	margin-top: 0px;
	margin-bottom: 0px;
	margin-left: 50px; 
  }
  P.parametersummary {
    font-family: Verdana;
	margin-top: 0px;
	margin-bottom: 10px;
	margin-left: 50px; 
  }
  H4.returns {
    font-family: Verdana; 
	margin-top: 0px;
	margin-bottom: 0px;
	margin-left: 50px; 
  }
  P.returnssummary {
    font-family: Verdana;
	margin-top: 0px;
	margin-bottom: 10px;
	margin-left: 50px; 
  }
  STRONG {
	font-family: Verdana;
	font-style: italic;
	font-weight: normal;
  }
</style>

</HEAD>
<BODY>
<H1 class="chapter">Справочник по командам EV3 Бейсик</H1>
<P>
<STRONG>Перевод: Андрей Степанов, «Карандаш и Самоделкин»</STRONG>
</P>

<H2 class="object">Assert</H2>
<P class="objectsummary">Функции отладки, помогающие проверить на правильность части кода.<BR>			Добавляя проверки утверждений, вы можете легко найти ошибки в программе. Например, когда часть программы зависит от переменной A, имеющей положительное значение, вы можете использовать Assert.Greater(A, 0, "A must be > 0!").<BR>			Когда программа проверяет утверждение, которое не выполняется, выведется указанное сообщение об ошибке.</P>
<H3 class="operation">Assert.Equal (a, b, message)</H3>
<P class="operationsummary">Проверяет, равны ли два значения. Проверяется полное совпадение, даже "True" и "tRue" различными выражениями.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.Failed (message)</H3>
<P class="operationsummary">Вывести сообщение об ошибке на экран. Эта функция должна использоваться только в том случае, если ошибка уже произошла.</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено на экран</P>
<H3 class="operation">Assert.Greater (a, b, message)</H3>
<P class="operationsummary">Проверяет, больше ли первое число второго.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.GreaterEqual (a, b, message)</H3>
<P class="operationsummary">Проверяет, больше или равно ли первое число второму.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.Less (a, b, message)</H3>
<P class="operationsummary">Проверяет, меньше ли первое число второго.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.LessEqual (a, b, message)</H3>
<P class="operationsummary">Проверяет, меньше или равно ли первое число второму.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.Near (a, b, message)</H3>
<P class="operationsummary">Проверяет, почти равны два числа. Это может быть полезно при сравнении двух дробных чисел с большим количеством знаков после запятой. Их округление может вызвать немного различные результаты</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H3 class="operation">Assert.NotEqual (a, b, message)</H3>
<P class="operationsummary">Проверяет, неравны ли два значения. Проверяется полное совпадение, даже "True" и "tRue" различными выражениями.</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первое значение</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второе значение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение, которое будет выведено, если проверка провалилась</P>
<H2 class="object">Buttons</H2>
<P class="objectsummary">Прочитать состояния и нажатия (включая щелчки) кнопок на блоке EV3.<BR>Кнопки обозначаются с использованием следующих символов:<BR>U   Вверх<BR>E   Центр<BR>D   Вниз<BR>R   Вправо<BR>L   Влево</P>
<H3 class="property">Buttons.Current - Свойство</H3>
<P class="propertysummary">Кнопки, которые в данный момент нажаты.<BR>Содержит текст с символами, соответствующим всем кнопкам, нажатым в данный момент.</P>
<H3 class="operation">Buttons.Flush ()</H3>
<P class="operationsummary">Очистить состояние нажатых кнопок. Последующие вызовы GetClicks покажет только те кнопки, которые были нажаты после очистки.</P>
<H3 class="operation">Buttons.GetClicks ()</H3>
<P class="operationsummary">Проверяет, какие кнопки были нажаты с момент последнего вызова GetClicks и возвращает текст, содержащий соответствующие им символы. <BR>Состояние кнопок при этом очищается. Также издает звук, когда зафиксировано нажатие кнопок.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текст, содержащий символы нажатых кнопок (может быть пустым, если ничего не нажато)</P>
<H3 class="operation">Buttons.Wait ()</H3>
<P class="operationsummary">Ждать, пока одна из кнопок на блоке будет нажата.</P>
<H2 class="object">Byte</H2>
<P class="objectsummary">Манипуляция отдельными битами 8-битовых чисел.<BR>Эта библиотека позволяет обрабатывать числа SmallBasic, так как если бы они были организованы в виде 8-битных целочисленных значений («байты»). Для этого значения параметра всегда преобразуются в простые байты, затем выполняется запрошенная операция, а затем результат преобразуется обратно в SmallBasic-число.<BR>Поддерживаются обычные битовые операции: AND, OR, NOT, XOR, разные сдвиги и операции преобразования данных. Обратите внимание, что идентификаторы AND и OR являются зарезервированными словами SmallBasic, поэтому эти операции называются AND_ и OR_. Для получения дополнительной информации см. https://ru.wikipedia.org/wiki/Битовые_операции .</P>
<H3 class="operation">Byte.AND_ (a, b)</H3>
<P class="operationsummary">Побитовое «И»</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первый операнд</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второй операнд</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, получаемое, когда между каждыми битами входных чисел выполняется логическое «И»</P>
<H3 class="operation">Byte.B (value)</H3>
<P class="operationsummary">Преобразование строки, содержащей двоичное число в обычное число.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Строка, содержащая байт в виде двоичного числа (Например: "01001111")</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Байт в виде числа</P>
<H3 class="operation">Byte.BIT (value, index)</H3>
<P class="operationsummary">Извлекает один бит из байта.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Байтовое число, из которого извлекается бит</P>
<H4 class="parameter">index</H4>
<P class="parametersummary">Позиция бита внутри байта</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Бит в указанной позиции, который равен 0 или 1</P>
<H3 class="operation">Byte.H (value)</H3>
<P class="operationsummary">Преобразование строки, содержащей шестнадцатеричное число в обычное число.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Строка, содержащая байт в виде шестнадцатеричного числа (Например: "4F")</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Байт в виде числа</P>
<H3 class="operation">Byte.L (value)</H3>
<P class="operationsummary">Преобразование строки, содержащей логическое значение в числовые 0 или 1.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Строка, содержащая логическое значение. Все различающиеся к регистру варианты "True" ("TRUE","TrUe", "truE", т.д.) считаются одинаковыми. Все остальные воспринимаются как "False".</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">0 или 1</P>
<H3 class="operation">Byte.NOT (value)</H3>
<P class="operationsummary">Побитовое отрицание.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Число для отрицания</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, получаемое, когда каждый бит входного байта индивидуально инвертируется</P>
<H3 class="operation">Byte.OR_ (a, b)</H3>
<P class="operationsummary">Побитовое «ИЛИ»</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первый операнд</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второй операнд</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, получаемое, когда между каждыми битами входных чисел выполняется логическое «ИЛИ»</P>
<H3 class="operation">Byte.SHL (value, distance)</H3>
<P class="operationsummary">Побитовый сдвиг влево.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Байт, чьи биты будут сдвинуты</P>
<H4 class="parameter">distance</H4>
<P class="parametersummary">На сколько позиций будут смещены биты</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, которое вы получаете после перемещения каждого бита входного значения в сторону более значимых позиций</P>
<H3 class="operation">Byte.SHR (value, distance)</H3>
<P class="operationsummary">Побитовый сдвиг вправо.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Байт, чьи биты будут сдвинуты</P>
<H4 class="parameter">distance</H4>
<P class="parametersummary">На сколько позиций будут смещены биты</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, которое вы получаете после перемещения каждого бита входного значения в сторону менее значимых позиций</P>
<H3 class="operation">Byte.ToBinary (value)</H3>
<P class="operationsummary">Преобразование 8-битового байта в строку, содержащую восьмизначное двоичное число.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Байт для преобразования в строку</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Строка, содержащая восьмизначное двоичное число</P>
<H3 class="operation">Byte.ToHex (value)</H3>
<P class="operationsummary">Преобразование 8-битового байта в строку, содержащую двухзначное шестнадцатеричное число.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Байт для преобразования в строку</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Строка, содержащая двухзначное шестнадцатеричное число</P>
<H3 class="operation">Byte.ToLogic (value)</H3>
<P class="operationsummary">Преобразует число (может быть 8-битным байтом или любым другим числом) в логическое значение "True" или "False".<BR>Это значение затем можно использовать для условия в If или While или чего либо еще.<BR>Обратите внимание, что любое входное значение больше 0 приводит к "True", а входное значение 0 или любое отрицательное значение приводит к "False".<BR>Такое поведение позволяет создавать некоторые странные и замечательные вещи с помощью этой команды. Подробнее на https://goo.gl/KiZrqS</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Число, которое должно быть преобразовано в соответствующее логическое значение</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">"True" или "False"</P>
<H3 class="operation">Byte.XOR (a, b)</H3>
<P class="operationsummary">Побитовое исключающее «ИЛИ»</P>
<H4 class="parameter">a</H4>
<P class="parametersummary">Первый операнд</P>
<H4 class="parameter">b</H4>
<P class="parametersummary">Второй операнд</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, получаемое, когда между каждыми битами входных чисел выполняется исключающее «ИЛИ»</P>
<H2 class="object">EV3</H2>
<P class="objectsummary">Полезные функции блока EV3.</P>
<H3 class="property">EV3.BatteryLevel - Свойство</H3>
<P class="propertysummary">Возвращает текущий заряд батарей, от 0 до 100.</P>
<H3 class="property">EV3.Time - Свойство</H3>
<P class="propertysummary">Время в миллисекундах, прошедшее с момента запуска программы.</P>
<H3 class="operation">EV3.QueueNextCommand ()</H3>
<P class="operationsummary">Повышение производительности при работе в режиме «ПК». Не посылать следующую команду на блок сразу же, а подождать, поставив ее в очередь. В режиме запуска программы на блоке не имеет смысла.</P>
<H3 class="operation">EV3.SetLEDColor (color, effect)</H3>
<P class="operationsummary">Установить цвет подсветки кнопок блока EV3 и ее эффекты.<BR>Подсветка: OFF - выключена, GREEN - зеленая, RED - красная, ORANGE - оранжевая. Эффекты: NORMAL - гореть постоянно, FLASH - вспыхивать, PULSE - пульсировать.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">Может быть "OFF", "GREEN", "RED", "ORANGE"</P>
<H4 class="parameter">effect</H4>
<P class="parametersummary">Может быть "NORMAL", "FLASH", "PULSE"</P>
<H3 class="operation">EV3.SystemCall (commandline)</H3>
<P class="operationsummary">Запустить одну системную команду в операционной системе EV3 Linux. Выполняемая программа будет ждать, пока запущенная в операционной системе программа не завершит работу.</P>
<H4 class="parameter">commandline</H4>
<P class="parametersummary">Системная команда.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Статус завершения запущенной команды</P>
<H2 class="object">EV3File</H2>
<P class="objectsummary">Доступ к файловой системе блока EV3 для чтения или записи данных.<BR>К именам файлов может быть добавлен абсолютный путь начиная с '/' для доступа к любому файлу в файловой системе или относительный, начиная с папки prjs.</P>
<H3 class="operation">EV3File.Close (handle)</H3>
<P class="operationsummary">Закрывает открытый файл.</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H3 class="operation">EV3File.ConvertToNumber (text)</H3>
<P class="operationsummary">Конвертация текста в число.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, содержащий число, может содержать также дробную часть числа</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число</P>
<H3 class="operation">EV3File.OpenAppend (filename)</H3>
<P class="operationsummary">Открывает файл для добавления в него данных. Если файл не существует, он будет создан.</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя файла для создания/добавления данных</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Номер, идентифицирующий данный открытый файл (file handle)</P>
<H3 class="operation">EV3File.OpenRead (filename)</H3>
<P class="operationsummary">Открывает файл для чтения. Если файл не существует, возвращает 0.</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя файла для чтения</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Номер, идентифицирующий данный открытый файл (file handle) или 0, если файл не существует</P>
<H3 class="operation">EV3File.OpenWrite (filename)</H3>
<P class="operationsummary">Открывает файл для перезаписи. Если файл не существует, он будет создан.</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя файла для создания/перезаписи</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Номер, идентифицирующий данный открытый файл (file handle)</P>
<H3 class="operation">EV3File.ReadByte (handle)</H3>
<P class="operationsummary">Прочитать один байт из файла.</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Следующий по счету байт из файла</P>
<H3 class="operation">EV3File.ReadLine (handle)</H3>
<P class="operationsummary">Прочитать текстовую строку из файла. Строка будет прочитана в кодировке ISO-8859-1 и должна оканчиваться символом перевода строки (код 10).</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текстовая строка, прочитанная из текущей строки файла</P>
<H3 class="operation">EV3File.ReadNumberArray (handle, size)</H3>
<P class="operationsummary">Читает массив чисел из бинарного файла. Числа будут раскодированы с использованием кодировки IEEE как тип Float с одинарной точностью</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H4 class="parameter">size</H4>
<P class="parametersummary">Размер массива, который будет прочитан</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив чисел указанного размера</P>
<H3 class="operation">EV3File.TableLookup (filename, bytes_per_row, row, column)</H3>
<P class="operationsummary">Функция предназначена для чтения байт из потенциально огромных файлов, которые слишком велики, чтобы быть переданы в память в целом.<BR>Поскольку файл может быть настолько большой, что численной адресации будет недостаточно, вводятся параметры строка/столбец</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя файла</P>
<H4 class="parameter">bytes_per_row</H4>
<P class="parametersummary">Если файл имеет структуру строк/столбцов, в параметре указывается число байт в строке, иначе указывай 1</P>
<H4 class="parameter">row</H4>
<P class="parametersummary">Читаемая строка (начиная с 0)</P>
<H4 class="parameter">column</H4>
<P class="parametersummary">Читаемый столбец (начиная с 0)</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Байт из указанной позиции</P>
<H3 class="operation">EV3File.WriteByte (handle, data)</H3>
<P class="operationsummary">Записывает один байт данных в файл.</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H4 class="parameter">data</H4>
<P class="parametersummary">Один байт для записи (значение от 0 до 255).</P>
<H3 class="operation">EV3File.WriteLine (handle, text)</H3>
<P class="operationsummary">Записывает текстовую строку в файл. Строка будет записана в кодировке ISO-8859-1 и оканчиваться символом перевода строки (код 10).</P>
<H4 class="parameter">handle</H4>
<P class="parametersummary">Идентификатор файла (file handle), полученный в момент открытия файла</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст для записи в файл</P>
<H2 class="object">F</H2>
<P class="objectsummary">Объект для создания функций с параметрами и локальными переменными в Small Basic.<BR>Позволяет программам вызывать пользовательские функции в форме, подобной той, которая возможна со встроенными командами, включая более удобные параметры передачи и возврата.<BR>Функции могут быть созданы с помощью команды F.Function и могут быть позже вызваны с помощью одной из команд F.Call .<BR>См. пример «Function.sb» для лучшего введения.</P>
<H3 class="property">F.Start - Свойство</H3>
<P class="propertysummary">Это свойство должно быть установлено в подпрограмму перед выполнением последующей операции F.Function, которая настраивает функцию.</P>
<H3 class="operation">F.Call0 (name)</H3>
<P class="operationsummary">Исполнить вызов функции без параметров.</P>
<H4 class="parameter">name</H4>
<P class="parametersummary">Имя функции (без учета регистра)</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение, возвращаемое функцией</P>
<H3 class="operation">F.Call1 (name, p1)</H3>
<P class="operationsummary">Исполнить вызов функции с 1 параметром.</P>
<H4 class="parameter">name</H4>
<P class="parametersummary">Имя функции (без учета регистра)</P>
<H4 class="parameter">p1</H4>
<P class="parametersummary">Параметр 1</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение, возвращаемое функцией</P>
<H3 class="operation">F.Call2 (name, p1, p2)</H3>
<P class="operationsummary">Исполнить вызов функции с 2 параметрами.</P>
<H4 class="parameter">name</H4>
<P class="parametersummary">Имя функции (без учета регистра)</P>
<H4 class="parameter">p1</H4>
<P class="parametersummary">Параметр 1</P>
<H4 class="parameter">p2</H4>
<P class="parametersummary">Параметр 2</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение, возвращаемое функцией</P>
<H3 class="operation">F.Function (name, parameterdefinitions)</H3>
<P class="operationsummary">Создать именованную функцию и ее локальные переменные (параметры), а так же их значения по умолчанию. Перед выполнением этой команды свойство F.Start должно быть установлено в подпрограмму, которая затем станет отправной точкой для функции.<BR>Локальные переменные также используются для передачи параметров при вызове: для любого вызова с n параметрами эти параметры станут начальными значениями первых n локальных переменных. У остальных локальных переменных останутся значения по умолчанию.</P>
<H4 class="parameter">name</H4>
<P class="parametersummary">Имя для функции (должно быть строковым литералом)</P>
<H4 class="parameter">parameterdefinitions</H4>
<P class="parametersummary">Строка, содержащая последовательность имен локальных переменных и их начальных значений. Например: "A B:5 T:hello". Если значение по умолчанию не указано, будет использовано 0.</P>
<H3 class="operation">F.Get (variablename)</H3>
<P class="operationsummary">Получить значение локальной переменной.</P>
<H4 class="parameter">variablename</H4>
<P class="parametersummary">Имя локальной переменной (без учета регистра)</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение, которое содержит переменная</P>
<H3 class="operation">F.Return ()</H3>
<P class="operationsummary">Немедленное завершение вызова текущей функции.<BR>При компиляции на EV3, можно использовать только в изначальной процедуре функции.</P>
<H3 class="operation">F.ReturnNumber (value)</H3>
<P class="operationsummary">Немедленное завершение текущего вызова функции и возвращение значения в качестве числа обратно команде вызова.<BR>При компиляции на EV3, можно использовать только в изначальной процедуре функции.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Возвращаемое значение (должно быть числом)</P>
<H3 class="operation">F.ReturnText (value)</H3>
<P class="operationsummary">Немедленное завершение текущего вызова функции и возвращение значения в качестве текста обратно команде вызова.<BR>При компиляции на EV3, можно использовать только в изначальной процедуре функции.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Возвращаемое значение (интерпретируется как текст)</P>
<H3 class="operation">F.Set (variablename, value)</H3>
<P class="operationsummary">Записать в локальную переменную указанное значение.</P>
<H4 class="parameter">variablename</H4>
<P class="parametersummary">Имя локальной переменной (без учета регистра)</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Значение, сохраняемое в локальную переменную</P>
<H2 class="object">LCD</H2>
<P class="objectsummary">Управление ЖК-экраном на блоке EV3.<BR>EV3 имеет черно-белый дисплей с разрешением 178x128 точек. Координаты отсчитываются от левого верхнего угла экрана, имеющего координаты (0;0)</P>
<H3 class="operation">LCD.BmpFile (color, x, y, filename)</H3>
<P class="operationsummary">Вывести файл заданным цветом на экран. Поддерживаются только файлы в формате .rgf</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X левой стороны изображения</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y верхней стороны изображения</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя файла без расширения .rgf. Может содержать относительный путь от папки 'prjs' или абсолютный, начинаясь с '/').</P>
<H3 class="operation">LCD.Circle (color, x, y, radius)</H3>
<P class="operationsummary">Рисует не закрашенный круг указанного размера.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X центра круга</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y центра круга</P>
<H4 class="parameter">radius</H4>
<P class="parametersummary">Радиус круга</P>
<H3 class="operation">LCD.Clear ()</H3>
<P class="operationsummary">Очистка экрана. Все пиксели закрашиваются в белый цвет.</P>
<H3 class="operation">LCD.FillCircle (color, x, y, radius)</H3>
<P class="operationsummary">Рисует закрашенный круг указанного размера.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X центра круга</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y центра круга</P>
<H4 class="parameter">radius</H4>
<P class="parametersummary">Радиус круга</P>
<H3 class="operation">LCD.FillRect (color, x, y, width, height)</H3>
<P class="operationsummary">Рисует закрашенный заданным цветом прямоугольник.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X левой стороны прямоугольника</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y верхней стороны прямоугольника</P>
<H4 class="parameter">width</H4>
<P class="parametersummary">Ширина прямоугольника</P>
<H4 class="parameter">height</H4>
<P class="parametersummary">Высота прямоугольника</P>
<H3 class="operation">LCD.InverseRect (x, y, width, height)</H3>
<P class="operationsummary">Инвертирует все пиксели в границах прямоугольника.</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X левой стороны прямоугольника</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y верхней стороны прямоугольника</P>
<H4 class="parameter">width</H4>
<P class="parametersummary">Ширина прямоугольника</P>
<H4 class="parameter">height</H4>
<P class="parametersummary">Высота прямоугольника</P>
<H3 class="operation">LCD.Line (color, x1, y1, x2, y2)</H3>
<P class="operationsummary">Вывод на экран линии указанного цвета.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x1</H4>
<P class="parametersummary">Координата X начальной точки</P>
<H4 class="parameter">y1</H4>
<P class="parametersummary">Координата Y начальной точки</P>
<H4 class="parameter">x2</H4>
<P class="parametersummary">Координата X конечной точки</P>
<H4 class="parameter">y2</H4>
<P class="parametersummary">Координата Y конечной точки</P>
<H3 class="operation">LCD.Pixel (color, x, y)</H3>
<P class="operationsummary">Вывод на экран одиночного пикселя указанного цвета.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X по горизонтали</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y по вертикали</P>
<H3 class="operation">LCD.Rect (color, x, y, width, height)</H3>
<P class="operationsummary">Рисует не закрашенный прямоугольник с границей заданного цвета.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X левой стороны прямоугольника</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y верхней стороны прямоугольника</P>
<H4 class="parameter">width</H4>
<P class="parametersummary">Ширина прямоугольника</P>
<H4 class="parameter">height</H4>
<P class="parametersummary">Высота прямоугольника</P>
<H3 class="operation">LCD.StopUpdate ()</H3>
<P class="operationsummary">Начинать запоминать всю выводимую экран информацию без ее отображения. При следующем вызове Update() все накопленные изменения отобразятся.<BR>Вы можете использовать эту функцию, чтобы предотвратить мерцание или для ускорения рисования сложных изображений в ЖК-дисплее.</P>
<H3 class="operation">LCD.Text (color, x, y, font, text)</H3>
<P class="operationsummary">Напечатать заданный текст или числа на экране.</P>
<H4 class="parameter">color</H4>
<P class="parametersummary">0 (белый) или 1 (черный)</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X начала печати</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y начала печати</P>
<H4 class="parameter">font</H4>
<P class="parametersummary">Размер шрифта: 0 (маленький), 1 (полужирный), 2 (большой)</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст или число для вывода на дисплей</P>
<H3 class="operation">LCD.Update ()</H3>
<P class="operationsummary">Вывести на экран все изменения, которые произошли с момента последнего вызова StopUpdate().</P>
<H3 class="operation">LCD.Write (x, y, text)</H3>
<P class="operationsummary">Напечатать заданный текст черным цветом на экране.<BR>Если нужно выводить текст с выбором цвета и размера, используй LCD.Text</P>
<H4 class="parameter">x</H4>
<P class="parametersummary">Координата X начала печати</P>
<H4 class="parameter">y</H4>
<P class="parametersummary">Координата Y начала печати</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст или числа для вывода на дисплей</P>
<H2 class="object">Mailbox</H2>
<P class="objectsummary">Отправка сообщений между блоками EV3 посредством Bluetooth</P>
<H3 class="operation">Mailbox.Connect (brickname)</H3>
<P class="operationsummary">Установить соединение с другим блоком EV3 по Bluetooth.<BR>Только после того как соединение установлено (этой командой или из меню блока EV3) могут отправляться и приниматься сообщения.</P>
<H4 class="parameter">brickname</H4>
<P class="parametersummary">Имя блока EV3, с которым нужно установить соединение</P>
<H3 class="operation">Mailbox.Create (boxname)</H3>
<P class="operationsummary">Создать почтовый ящик с указанным именем, который будет принимать входящие сообщения, адресованные этому блоку EV3 в данный ящик.<BR>Только после создания ящика входящие сообщения будут сохраняться. Максимальное количество создаваемых ящиков - 30.</P>
<H4 class="parameter">boxname</H4>
<P class="parametersummary">Имя почтового ящика для создания</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Цифровой идентификатор почтового ящика. Необходим для получения сообщения из ящика</P>
<H3 class="operation">Mailbox.IsAvailable (id)</H3>
<P class="operationsummary">Проверка наличия нового сообщения в указанном локальном почтовом ящике.</P>
<H4 class="parameter">id</H4>
<P class="parametersummary">Цифровой идентификатор почтового ящика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">"True" если сообщение пришло. "False" в противном случае</P>
<H3 class="operation">Mailbox.Receive (id)</H3>
<P class="operationsummary">Получить последнее сообщение из указанного локального почтового ящика. Если ящик пуст, программа будет ожидать до тех пор, пока не появится новое сообщение в ящике.<BR>После прочтения сообщение будет удалено и следующий вызов Receive будет ожидать нового сообщения в ящике. Чтобы избежать блокировки в его ожидании, используйте IsAvailable().<BR>Если почтовый ящик с таким именем не существует, команда возвратит пустой текст.</P>
<H4 class="parameter">id</H4>
<P class="parametersummary">Цифровой идентификатор почтового ящика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Сообщение в виде текста. Пока поддерживаются только текстовые сообщения</P>
<H3 class="operation">Mailbox.Send (brickname, boxname, message)</H3>
<P class="operationsummary">Отправить сообщение на другой блок EV3 в указанный почтовый ящик.</P>
<H4 class="parameter">brickname</H4>
<P class="parametersummary">Имя блока EV3, на который отправляется сообщение. Bluetooth-соединение с блоком должно быть предварительно установлено. Это поле можно оставить пустым, тогда сообщение будет отправлено всем подключенным блокам EV3.</P>
<H4 class="parameter">boxname</H4>
<P class="parametersummary">Имя почтового ящика, в который будет отправлено сообщение</P>
<H4 class="parameter">message</H4>
<P class="parametersummary">Сообщение в виде текста. Пока поддерживаются только текстовые сообщения</P>
<H2 class="object">Math</H2>
<P class="objectsummary">Класс Math предоставляет множество полезных методов для математических операций.</P>
<H3 class="property">Math.Pi - Свойство</H3>
<P class="propertysummary">Получает значение Пи.</P>
<H3 class="operation">Math.Abs (number)</H3>
<P class="operationsummary">Возвращает абсолютное значение для заданного числа.  Например, для -32.233 метод вернет 32.233.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число, абсолютное значение которого надо получить.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Абсолютное значение заданного числа.</P>
<H3 class="operation">Math.ArcCos (cosValue)</H3>
<P class="operationsummary">Возвращает значение угла в радианах, соответствующее указанному значению косинуса.</P>
<H4 class="parameter">cosValue</H4>
<P class="parametersummary">Значение косинуса, для которого надо получить угол.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Угол (в радианах) для заданного значения косинуса.</P>
<H3 class="operation">Math.ArcSin (sinValue)</H3>
<P class="operationsummary">Возвращает значение угла в радианах, соответствующее указанному значению синуса.</P>
<H4 class="parameter">sinValue</H4>
<P class="parametersummary">Значение синуса, для которого надо получить угол.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Угол (в радианах) для заданного значения синуса.</P>
<H3 class="operation">Math.ArcTan (tanValue)</H3>
<P class="operationsummary">Получает угол в радианах для заданного значения тангенса.</P>
<H4 class="parameter">tanValue</H4>
<P class="parametersummary">Значения тангенса, для которого надо получить угол.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Угол (в радианах) для заданного значения тангенса.</P>
<H3 class="operation">Math.Ceiling (number)</H3>
<P class="operationsummary">Округляет заданное десятичное значение до большего или равного целого числа. Например, для 32,233 метод вернет 33.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число, которое надо округлить в большую сторону.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, округленное в большую сторону.</P>
<H3 class="operation">Math.Cos (angle)</H3>
<P class="operationsummary">Получает значение косинуса для заданного в радианах угла.</P>
<H4 class="parameter">angle</H4>
<P class="parametersummary">Значение угла (в радианах), чей косинус требуется вычислить.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение косинуса данного угла.</P>
<H3 class="operation">Math.Floor (number)</H3>
<P class="operationsummary">Округляет заданное десятичное значение до меньшего или равного целого числа.  Например, для 32,233 метод вернет 32.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число, которое надо округлить в меньшую сторону.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, округленное в меньшую сторону.</P>
<H3 class="operation">Math.GetDegrees (angle)</H3>
<P class="operationsummary">Конвертирует заданный угол из радиан в градусы.</P>
<H4 class="parameter">angle</H4>
<P class="parametersummary">Значение угла в радианах.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение угла, переведенное в градусы.</P>
<H3 class="operation">Math.GetRadians (angle)</H3>
<P class="operationsummary">Конвертирует заданный угол из градусов в радианы.</P>
<H4 class="parameter">angle</H4>
<P class="parametersummary">Значение угла в градусах.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение угла, переведенное в радианы.</P>
<H3 class="operation">Math.GetRandomNumber (maxNumber)</H3>
<P class="operationsummary">Возвращает случайное число в диапазоне между 1 и числом, заданным в параметре maxNumber (включительно).</P>
<H4 class="parameter">maxNumber</H4>
<P class="parametersummary">Максимальное значение для диапазона случайных чисел.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Случайное число, которое меньше или равно указанному максимальному значению.</P>
<H3 class="operation">Math.Log (number)</H3>
<P class="operationsummary">Получает десятичный логарифм для заданного числа.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число для вычисления десятичного логарифма.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Десятичный логарифм для указанного числа.</P>
<H3 class="operation">Math.Max (number1, number2)</H3>
<P class="operationsummary">Сравнивает два значение и возвращает большее из них.</P>
<H4 class="parameter">number1</H4>
<P class="parametersummary">Первое из сравниваемых чисел.</P>
<H4 class="parameter">number2</H4>
<P class="parametersummary">Второе из сравниваемых чисел.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Наибольшее значение из двух заданных чисел.</P>
<H3 class="operation">Math.Min (number1, number2)</H3>
<P class="operationsummary">Сравнивает два значение и возвращает меньшее из них.</P>
<H4 class="parameter">number1</H4>
<P class="parametersummary">Первое из сравниваемых чисел.</P>
<H4 class="parameter">number2</H4>
<P class="parametersummary">Второе из сравниваемых чисел.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Наименьшее значение из двух заданных чисел.</P>
<H3 class="operation">Math.NaturalLog (number)</H3>
<P class="operationsummary">Получает натуральный логарифм для заданного числа.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число, для которого надо вычислить натуральный логарифм.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение натурального логарифма для заданного числа.</P>
<H3 class="operation">Math.Power (baseNumber, exponent)</H3>
<P class="operationsummary">Возводит число в указанную степень.</P>
<H4 class="parameter">baseNumber</H4>
<P class="parametersummary">Число для возведения в степень.</P>
<H4 class="parameter">exponent</H4>
<P class="parametersummary">Степень, в которую надо возвести число.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Число, возведенное в указанную степень.</P>
<H3 class="operation">Math.Remainder (dividend, divisor)</H3>
<P class="operationsummary">Делит первое число на второе и возвращает остаток.</P>
<H4 class="parameter">dividend</H4>
<P class="parametersummary">Делимое.</P>
<H4 class="parameter">divisor</H4>
<P class="parametersummary">Делитель.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Остаток от деления.</P>
<H3 class="operation">Math.Round (number)</H3>
<P class="operationsummary">Округляет заданное десятичное значение до ближайшего целого числа.  Например, 32.233 будет округлено до 32.0, а 32.566 до 33.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число для округления.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Округленное значение заданного числа.</P>
<H3 class="operation">Math.Sin (angle)</H3>
<P class="operationsummary">Получает значение синуса для заданного в радианах угла.</P>
<H4 class="parameter">angle</H4>
<P class="parametersummary">Угол для вычисления синуса (в радианах).</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Синус для заданного угла.</P>
<H3 class="operation">Math.SquareRoot (number)</H3>
<P class="operationsummary">Получает квадратный корень для заданного числа.</P>
<H4 class="parameter">number</H4>
<P class="parametersummary">Число, квадратный корень которого надо вычислить.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Квадратный корень для заданного числа.</P>
<H3 class="operation">Math.Tan (angle)</H3>
<P class="operationsummary">Получает значение тангенса для заданного в радианах угла.</P>
<H4 class="parameter">angle</H4>
<P class="parametersummary">Значение угла (в радианах), чей тангенс требуется вычислить.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Значение тангенса данного угла.</P>
<H2 class="object">Motor</H2>
<P class="objectsummary">Управление моторами, подключенными к блоку EV3. Для функции Motor необходимо указать один или несколько портов, к которым подключены моторы, например "A", "BC", "ABD".<BR>Для блоков, подключенных к главному блоку по USB порты указываются так: "3BC", "2A". В этом режиме только двигатели одного блока доступны в одной команде.<BR>Скорость и Мощность - разные понятия. При вызове команды для вращения мотора с постоянной скоротью, электрическая мощность, подаваемая на него будет автоматически регулироваться, чтобы поддерживать заданную скорость.<BR>При вызове команды для вращения мотора с постоянной мощностью, его скорость будет зависеть от сопротивления, которое он испытывает во время работы.</P>
<H3 class="operation">Motor.GetCount (port)</H3>
<P class="operationsummary">Запросить данные счетчика оборота с указанного мотора.<BR>Счетчик оборотов работает даже если мотор вращается не по командам блока EV3, а путем приложения внешней силы.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Порт мотора</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текущее значение счетчика оборотов мотора в градусах</P>
<H3 class="operation">Motor.GetSpeed (port)</H3>
<P class="operationsummary">Запросить текущую скорость мотора</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Порт мотора</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текущая скорость в диапазоне от -100 до 100</P>
<H3 class="operation">Motor.Invert (ports)</H3>
<P class="operationsummary">Инвертирует полярность (направление) одного или нескольких двигателей. Это повлияет на все будущие команды, которые управляют этими двигателями, а также инвертируются показания энкодера и скорости.<BR>Эта операция позволяет легко изменить направление вращения двигателя без изменения остальной части программы.<BR>Вам просто нужно добавить одну команду Motor.Invert() в самом начале программы. Обратите внимание, что далее нельзя будет отключить инверсию.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Номер порта мотора(ов)</P>
<H3 class="operation">Motor.IsBusy (ports)</H3>
<P class="operationsummary">Проверить один или несколько моторов на занятость.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">"True" если хотя бы один из моторов запущен, "False" в противном случае.</P>
<H3 class="operation">Motor.Move (ports, speed, degrees, brake)</H3>
<P class="operationsummary">Поворачивает один или несколько моторов с заданной скоростью на указанный угол (в градусах).<BR>Программа не будет переходить к выполнению следующих команд до тех пор, пока моторы не повернутся на требуемый угол.<BR>Если тебе нужно больше возможностей по управлению моторами, например плавный старт и замедление, используй команду Motor.Schedule</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед)</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол поворота</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.MovePower (ports, power, degrees, brake)</H3>
<P class="operationsummary">Поворачивает один или несколько моторов с заданной мощностью на указанный угол (в градусах).<BR>Программа не будет переходить к выполнению следующих команд до тех пор, пока моторы не повернутся на требуемый угол.<BR>Если тебе нужно больше возможностей по управлению моторами, например плавное наращивание мощности или ее уменьшение, используй команду Motor.SchedulePower</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H4 class="parameter">power</H4>
<P class="parametersummary">Мощность от -100 (полный назад) до 100 (полный вперед)</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол поворота</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.MoveSteer (ports, speed, turn, degrees, brake)</H3>
<P class="operationsummary">Устанивливает два двигателя для работы с заданной скоростью и относительным направлением.<BR>Соотношение определяется параметром «Turn», который определяет направление робота с простым приводом на два колеса (учитывая, что последний двигатель установлен слева).<BR>Двигатели будут синхронизированы, что означает, что если один двигатель испытывает некоторое сопротивление и не может поддерживать свою скорость, другой двигатель также будет замедляться или вообще останавливаться. Это особенно полезно для роботов с двумя независимыми колесами, которые должны идти прямо или совершать определенный поворот.<BR>Угол перемещения для двигателя с более высокой скоростью.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух моторов (например, "AB" или "CD").</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный вперед) до 100 (полный вперед) более быстрого двигателя.</P>
<H4 class="parameter">turn</H4>
<P class="parametersummary">Коэффициент поворота от -100 (вращение влево на месте) до 100 (вращение вправо на месте).</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол, на который должен повернуться более быстрый мотор.</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.MoveSync (ports, speed1, speed2, degrees, brake)</H3>
<P class="operationsummary">Поворачивает два мотора синхронно на определенное количество градусов.<BR>Синхронная работа двигателей означает, что когда один двигатель нагружен и что-то препятствует его вращению, второй двигатель пропорционально замедлится или даже вообще остановится.<BR>Это команда особенно полезна для роботов с двумя независимыми колесами - для возможнрости сохранить траекторию движения.<BR>Угол, на который будет повернуты моторы относится к мотору с наибольшей скоростью вращения, угол поворота второго мотора будет рассчитан пропорционально его скорости.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух портов для моторов (например "AB" или "CD")</P>
<H4 class="parameter">speed1</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта</P>
<H4 class="parameter">speed2</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алавиту номером порта</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол поворота (мотора с наибольшей скоростью)</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.ResetCount (ports)</H3>
<P class="operationsummary">Сбросить счетчик оборотов одного или несколько моторов до 0.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H3 class="operation">Motor.Schedule (ports, speed, degrees1, degrees2, degrees3, brake)</H3>
<P class="operationsummary">Запустить один или несколько моторов с указанной скоростью с возможностью плавного старта и плавного замедления.<BR>Скорость может регулироваться в пределах общего угла поворота, в Зоне1 двигатель разгоняется до указанной скорости, в Зоне2 поддерживает ее, в Зоне3 - замедляется до полной остановки.<BR>Полный угол, на который повернется мотор - это сумма углов поворота Зона1 + Зона2 + Зона3.<BR>Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - используй Wait().</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед)</P>
<H4 class="parameter">degrees1</H4>
<P class="parametersummary">Зона1: угл поворота мотора, в пределах которой он разгоняется</P>
<H4 class="parameter">degrees2</H4>
<P class="parametersummary">Зона2: угл поворота мотора, в пределах которой он поддерживает указанную скорость</P>
<H4 class="parameter">degrees3</H4>
<P class="parametersummary">Зона3: угл поворота мотора, в пределах которой он плавно замедляется до полной остановки</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.SchedulePower (ports, power, degrees1, degrees2, degrees3, brake)</H3>
<P class="operationsummary">Запустить один или несколько моторов с указанной мощностью с возможностью плавного старта и плавного замедления.<BR>Мощность может регулироваться в пределах общего угла поворота, в Зоне1 двигатель плавно наращивает мощность до указанной, в Зоне2 поддерживает ее, в Зоне3 - плавно уменьшает подаваемую мощность до полной остановки.<BR>Полный угол, на который повернется мотор - это сумма углов поворота Зона1 + Зона2 + Зона3.<BR>Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - используй Wait().</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H4 class="parameter">power</H4>
<P class="parametersummary">Мощность от -100 (полный назад) до 100 (полный вперед)</P>
<H4 class="parameter">degrees1</H4>
<P class="parametersummary">Зона1: угл поворота мотора, в пределах которой он разгоняется</P>
<H4 class="parameter">degrees2</H4>
<P class="parametersummary">Зона2: угл поворота мотора, в пределах которой он поддерживает указанную скорость</P>
<H4 class="parameter">degrees3</H4>
<P class="parametersummary">Зона3: угл поворота мотора, в пределах которой он плавно замедляется до полной остановки</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.ScheduleSteer (ports, speed, turn, degrees, brake)</H3>
<P class="operationsummary">Устанивливает два двигателя для работы с заданной скоростью и относительным направлением.<BR>Соотношение определяется параметром «Turn», который определяет направление робота с простым приводом на два колеса (учитывая, что последний двигатель установлен слева).<BR>Двигатели будут синхронизированы, что означает, что если один двигатель испытывает некоторое сопротивление и не может поддерживать свою скорость, другой двигатель также будет замедляться или вообще останавливаться. Это особенно полезно для роботов с двумя независимыми колесами, которые должны идти прямо или совершать определенный поворот.<BR>Угол перемещения для двигателя с более высокой скоростью.<BR>Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - испольузйте Wait().</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух моторов (например, "AB" или "CD").</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный вперед) до 100 (полный вперед) более быстрого двигателя.</P>
<H4 class="parameter">turn</H4>
<P class="parametersummary">Коэффициент поворота от -100 (вращение влево на месте) до 100 (вращение вправо на месте).</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол, на который должен повернуться более быстрый мотор.</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.ScheduleSync (ports, speed1, speed2, degrees, brake)</H3>
<P class="operationsummary">Поворачивает два мотора синхронно на определенное количество градусов.<BR>Синхронная работа двигателей означает, что когда один двигатель нагружен и что-то препятствует его вращению, второй двигатель пропорционально замедлится или даже вообще остановится.<BR>Это команда особенно полезна для для роботов с двумя независимыми колесами - для возможности сохранить траекторию движения.<BR>Угол, на который будет повернуты моторы относится к мотору с наибольшей скоростью вращения, угол поворота второго мотора будет рассчитан пропорционально его скорости.<BR>Команда передает управление в программу сразу, не ждет, пока мотор повернется. Чтобы отследить окончания отработки команды, используйте IsBusy(). Чтобы дождаться конца, пока мотор закончит отработку команды - испольузйте Wait().</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух портов для моторов (например "AB" или "CD")</P>
<H4 class="parameter">speed1</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта</P>
<H4 class="parameter">speed2</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алфавиту номером порта</P>
<H4 class="parameter">degrees</H4>
<P class="parametersummary">Угол поворота (мотора с наибольшей скоростью)</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.Start (ports, speed)</H3>
<P class="operationsummary">Запустить один или несколько моторов с указанной скоростью или изменить скорость уже запущенных моторов на указанную.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порт(ы) моторов</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед).</P>
<H3 class="operation">Motor.StartPower (ports, power)</H3>
<P class="operationsummary">Запустить один или несколько моторов с указанной мощностью или изменить мощность уже запущенных моторов на указанную.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порт(ы) моторов</P>
<H4 class="parameter">power</H4>
<P class="parametersummary">Мощность от -100 (полный назад) до 100 (полный вперед).</P>
<H3 class="operation">Motor.StartSteer (ports, speed, turn)</H3>
<P class="operationsummary">Устанивливает два двигателя для работы с заданной скоростью и относительным направлением.<BR>Соотношение определяется параметром «Turn», который определяет направление робота с простым приводом на два колеса (учитывая, что последний двигатель установлен слева).<BR>Двигатели будут синхронизированы, что означает, что если один двигатель испытывает некоторое сопротивление и не может поддерживать свою скорость, другой двигатель также будет замедляться или вообще останавливаться. Это особенно полезно для роботов с двумя независимыми колесами, которые должны идти прямо или совершать определенный поворот.<BR>Двигатели будут продолжать работать, пока управление не перехватит другая команда.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух моторов (например, "AB" или "CD").</P>
<H4 class="parameter">speed</H4>
<P class="parametersummary">Скорость от -100 (полный вперед) до 100 (полный вперед) более быстрого двигателя.</P>
<H4 class="parameter">turn</H4>
<P class="parametersummary">Коэффициент поворота от -100 (вращение влево на месте) до 100 (вращение вправо на месте).</P>
<H3 class="operation">Motor.StartSync (ports, speed1, speed2)</H3>
<P class="operationsummary">Синхронно запустить два мотора с указанными скоростями в режиме контроля за их вращением.<BR>Если один мотор будет испытывать нагрузку, которая замедлит его скорость, второй мотор пропорционально замедлится, чтобы сохранить траекторию движения.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Имена двух портов для моторов (например "AB" или "CD").</P>
<H4 class="parameter">speed1</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора с младшим по алфавиту номером порта</P>
<H4 class="parameter">speed2</H4>
<P class="parametersummary">Скорость от -100 (полный назад) до 100 (полный вперед) мотора со старшим по алфавиту номером порта</P>
<H3 class="operation">Motor.Stop (ports, brake)</H3>
<P class="operationsummary">Остановить один или несколько моторов. Команда завершает так же все запланированные или незавершенные команды управления этими моторами.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порт(ы) моторов</P>
<H4 class="parameter">brake</H4>
<P class="parametersummary">"True", если следует затормозить и удерживать положение моторов после завершения движения.</P>
<H3 class="operation">Motor.Wait (ports)</H3>
<P class="operationsummary">Подождать, пока моторы не закончат выполнять команды Schedule, Move, Steer или Stop.<BR>Использование этой команды, как правило, лучше, чем вызов IsBusy() в цикле.</P>
<H4 class="parameter">ports</H4>
<P class="parametersummary">Порты моторов</P>
<H2 class="object">Program</H2>
<P class="objectsummary">Класс Program предоставляет вспомогательные методы для контроля выполнения программы.</P>
<H3 class="property">Program.ArgumentCount - Свойство</H3>
<P class="propertysummary">Получает количество аргументов командной строки, переданных программе.</P>
<H3 class="property">Program.Directory - Свойство</H3>
<P class="propertysummary">Получает папку для запущенной программы.</P>
<H3 class="operation">Program.Delay (milliSeconds)</H3>
<P class="operationsummary">Задерживает выполнение программы на указанное число миллисекунд.</P>
<H4 class="parameter">milliSeconds</H4>
<P class="parametersummary">Время задержки.</P>
<H3 class="operation">Program.End ()</H3>
<P class="operationsummary">Заканчивает программу.</P>
<H3 class="operation">Program.GetArgument (index)</H3>
<P class="operationsummary">Возвращает указанный аргумент из тех, что были переданы в текущую программу.</P>
<H4 class="parameter">index</H4>
<P class="parametersummary">Индекс (порядковый номер) аргумента.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Аргумент командной строки, расположенный по указанному индексу.</P>
<H2 class="object">Sensor</H2>
<P class="objectsummary">Работа с датчиками, подключенными к блоку EV3. <BR>Чтобы указать локальный датчик, используется номер порта 1..4, для указания номеров портов на первом в цепочке подключенных по USB блоках используйте 5..8, на третьем - 9..12</P>
<H3 class="operation">Sensor.CommunicateI2C (port, address, writebytes, readbytes, writedata)</H3>
<P class="operationsummary">Взаимодействие с устройством, работающим по протоколу I2C, подключенному к одному из портов датчиков.<BR>Эта команда может посылать и принимать несколько байт по шине I2C, с ее помошью можно работать с датчиками сторонних производителей, использующих этот протокол обмена или, например, с Arduino.<BR>Обратите внимание, команда работает в пределах одного блока EV3 и только с подчиненными (slave) I2C устройствами.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">address</H4>
<P class="parametersummary">Адрес (0 - 127) подчиненного I2C устройства на шине I2C</P>
<H4 class="parameter">writebytes</H4>
<P class="parametersummary">Количество байт для отправки I2C-устройству (максимум 31).</P>
<H4 class="parameter">readbytes</H4>
<P class="parametersummary">Количество байт для приема с I2C-устройства (максимум 32, минимум 1).</P>
<H4 class="parameter">writedata</H4>
<P class="parametersummary">Массив, содержащий байты для отправки (индекс первого элемента - 0)</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив, содержащий запрошенное количество принятых байт с I2C-устройства (индекс первого элемента - 0)</P>
<H3 class="operation">Sensor.GetMode (port)</H3>
<P class="operationsummary">Запросить текущий режим работы датчика, подключенного к указанному порту.<BR>Многие датчики умеют работать в различных режимах. Например цветосветовой датчик умеет работать с режиме измерение отраженного света, в режиме измерения внешней освещенности, в режиме измерения цвета.<BR>При подключении датчика он как правило работает в режиме 0, затем режим можно изменить в программе.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текущий режим работы датчика (0 для режима по умолчанию)</P>
<H3 class="operation">Sensor.GetName (port)</H3>
<P class="operationsummary">Запросить имя и текущий режим работы датчика, подключенного к указанному порту.<BR>Эта команда предназначена прежде всего для диагностики, т.к. ты как правило знаешь, куда и какие датчики подключил</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текст описания (например "TOUCH")</P>
<H3 class="operation">Sensor.GetType (port)</H3>
<P class="operationsummary">Запросить цифровой идентификатор датчика, подключенного к указанному порту.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Цифровой идентификатор датчика (например 16 для датчика нажатия)</P>
<H3 class="operation">Sensor.IsBusy (port)</H3>
<P class="operationsummary">Проверить, не занят ли датчик в данный момент сменой режима или инициализацией. Во время переключения датчик некоторое время не доступен (занят).</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">"True" если датчик занят (не доступен)</P>
<H3 class="operation">Sensor.ReadI2CRegister (port, address, registernumber)</H3>
<P class="operationsummary">Эта команда обращается к одному устройству на шине I2C и пытается получить значение одного регистра подчиненного устройства I2C.<BR>Обратите внимание, что эта команда не работает в режиме подключения шлейфом.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">address</H4>
<P class="parametersummary">Адрес (0 - 127) подчиненного I2C устройства на шине I2C</P>
<H4 class="parameter">registernumber</H4>
<P class="parametersummary">Номер регистра на подчиненном устройстве для чтения данных.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Данные в регистре.</P>
<H3 class="operation">Sensor.ReadI2CRegisters (port, address, registernumber, readbytes)</H3>
<P class="operationsummary">Эта команда обращается к одному устройству на шине I2C и пытается получить значение нескольких регистров подчиненного устройства I2C.<BR>Обратите внимание, что эта команда не работает в режиме подключения шлейфом.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">address</H4>
<P class="parametersummary">Адрес (0 - 127) подчиненного I2C устройства на шине I2C</P>
<H4 class="parameter">registernumber</H4>
<P class="parametersummary">Номер первого регистра на подчиненном устройстве для чтения данных.</P>
<H4 class="parameter">readbytes</H4>
<P class="parametersummary">Количество регистров для чтения (максимум 32).</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив, содержащий запрошенные значения. Начинается с 0 индекса.</P>
<H3 class="operation">Sensor.ReadPercent (port)</H3>
<P class="operationsummary">Прочитать текущее показание датчика с отображением его в процентах (0..100).<BR>Большинство датчиков могут перевести свои показания в проценты, например у датчика нажатия 0 - не нажат, 100 - нажат.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текущее показание датчика (Пример для датчика освещенности 0 - очень темно, 100 - очень светло)</P>
<H3 class="operation">Sensor.ReadRaw (port, values)</H3>
<P class="operationsummary">Прочитать текущее показание датчика в "сыром" режиме, без перевода в проценты.<BR>В некоторых режимах показания датчика не могут быть переведены в проценты, например цвета, в этом случае используется команда чтения ReadRaw.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">values</H4>
<P class="parametersummary">Размер возвращаемого массива с показаниями</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив с показаниями датчика с требуемым числом элементов. Массив начинается с 0 элемента. Элементы, в которых данные не получены, будут равны 0</P>
<H3 class="operation">Sensor.ReadRawValue (port, index)</H3>
<P class="operationsummary">Похожа на ReadRaw, но возвращает только одно "сырое" показание с датчика, а не массив показаний.<BR>Например для работы с цветосветовым датчиком в режиме определения цвета используйте функцию ReadRawValue(порт, 0).</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">index</H4>
<P class="parametersummary">Индекс элемента массива с показаниями, начиная с 0</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Один элемент массива с показаниями</P>
<H3 class="operation">Sensor.SendUARTData (port, writebytes, writedata)</H3>
<P class="operationsummary">Посылает данные по протоколу UART устройству, подключенному к порту датчика.<BR>Функция полезна для общения с самодельными датчиками и исполнительными устройствами.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">writebytes</H4>
<P class="parametersummary">Количество байт для отправки на устройство (максимум 32).</P>
<H4 class="parameter">writedata</H4>
<P class="parametersummary">Массив, содержащий байты для отправки по UART (младший индекс 0).</P>
<H3 class="operation">Sensor.SetMode (port, mode)</H3>
<P class="operationsummary">Переключить режим работы датчика, подключенного к указанному порту.<BR>Датчики могут работать с различных режимах, например:<BR>EV3 датчик цвета, режимы 0 - отраженный свет, 1 - внешняя освещенность, 2 - цвет.<BR>Для уточнения какой датчик в какой режим можно переключить - смотрите документацию.<BR>Программа не продолжится до тех пор, пока датчик не переключится в новый режим и данные с него не будут доступны.<BR>Обратите внимание, что датчик будет оставаться в выбранном режиме даже после того, как программа завершит работу, поэтому<BR>чтобы избежать путаницы всегда устанавливайте режим в начале программы перед использованием датчика.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">mode</H4>
<P class="parametersummary">Новый режим работы из перечня разрешенных для данного типа датчика</P>
<H3 class="operation">Sensor.Wait (port)</H3>
<P class="operationsummary">Дождаться, пока датчик не переключится в новый режим или не инициализируется. <BR>Обычно тебе не нужно использовать эту команду, так как SetMode() дожидается смены режима.<BR>Если ты используешь параллельные задачи - без этой команды не обойтись - в ней датчик мог менять режим и стать на время недоступным.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H3 class="operation">Sensor.WriteI2CRegister (port, address, registernumber, value)</H3>
<P class="operationsummary">Эта команда обращается к одному устройству на шине I2C и пытается перезаписать значение одного регистра подчиненного устройства I2C.<BR>Обратите внимание, что эта команда не работает в режиме подключения шлейфом.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">address</H4>
<P class="parametersummary">Адрес (0 - 127) подчиненного I2C устройства на шине I2C</P>
<H4 class="parameter">registernumber</H4>
<P class="parametersummary">Регистр на подчиненном устройстве, с которого прочитаются данные.</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Значение записанное в регистр.</P>
<H3 class="operation">Sensor.WriteI2CRegisters (port, address, registernumber, writebytes, writedata)</H3>
<P class="operationsummary">Эта команда обращается к одному устройству на шине I2C и пытается перезаписать значение нескольких регистров подчиненного устройства I2C.<BR>Обратите внимание, что эта команда не работает в режиме подключения шлейфом.</P>
<H4 class="parameter">port</H4>
<P class="parametersummary">Номер порта датчика</P>
<H4 class="parameter">address</H4>
<P class="parametersummary">Адрес (0 - 127) подчиненного I2C устройства на шине I2C</P>
<H4 class="parameter">registernumber</H4>
<P class="parametersummary">Номер первого регистра на подчиненном устройстве для записи данных.</P>
<H4 class="parameter">writebytes</H4>
<P class="parametersummary">Количество регистров для записи (максимум 30).</P>
<H4 class="parameter">writedata</H4>
<P class="parametersummary">Массив, содержащий байты для записи (начинается с 0).</P>
<H2 class="object">Speaker</H2>
<P class="objectsummary">Использование динамика на блоке EV3 для воспроизведения тонов, нот или звуковых файлов.</P>
<H3 class="operation">Speaker.IsBusy ()</H3>
<P class="operationsummary">Проверить, занят ли динамик воспроизведением тона\ноты\звука</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">"True", если звук в данный момент проигрывается, "False" в противном случае.</P>
<H3 class="operation">Speaker.Note (volume, note, duration)</H3>
<P class="operationsummary">Воспроизвести ноту указанной высоты и длительности.</P>
<H4 class="parameter">volume</H4>
<P class="parametersummary">Громкость 0 - 100</P>
<H4 class="parameter">note</H4>
<P class="parametersummary">Нота в виде текста, от "C4" до "B7" с полутонами в виде "C#5"</P>
<H4 class="parameter">duration</H4>
<P class="parametersummary">Длительность ноты в миллисекундах</P>
<H3 class="operation">Speaker.Play (volume, filename)</H3>
<P class="operationsummary">Воспроизвести звуковой файл, хранящийся на блоке. Поддерживаются файлы только в формате .rsf</P>
<H4 class="parameter">volume</H4>
<P class="parametersummary">Громкость 0 - 100</P>
<H4 class="parameter">filename</H4>
<P class="parametersummary">Имя звукового файла без расширения .rsf Имя файла может содержать относительный путь от папки «prjs» путь или абсолютный, начиная с корня ФС '/'</P>
<H3 class="operation">Speaker.Stop ()</H3>
<P class="operationsummary">Остановить звучание любого проигрываемого в данный момент тона, ноты или звукового файла.</P>
<H3 class="operation">Speaker.Tone (volume, frequency, duration)</H3>
<P class="operationsummary">Воспроизвести тон указанной частоты и длительности.</P>
<H4 class="parameter">volume</H4>
<P class="parametersummary">Громкость 0 - 100</P>
<H4 class="parameter">frequency</H4>
<P class="parametersummary">Частота, Гц в диапазоне 250 - 10000</P>
<H4 class="parameter">duration</H4>
<P class="parametersummary">Длительность тона в миллисекундах</P>
<H3 class="operation">Speaker.Wait ()</H3>
<P class="operationsummary">Дождаться, пока проигрываемый в данный момент звук закончит воспроизводиться. Если звук не воспроизводится, команда сразу же передает управлению программе.</P>
<H2 class="object">Text</H2>
<P class="objectsummary">Объект Text обеспечивает работу с текстом.</P>
<H3 class="operation">Text.Append (text1, text2)</H3>
<P class="operationsummary">Соединяет два текстовых значения и возвращает полученное значение в качестве результата. Эта операция особенно полезна, когда осуществляется обработка неизвестного текста, который случайно может быть воспринят программой как число, чтобы избежать суммирования чисел.</P>
<H4 class="parameter">text1</H4>
<P class="parametersummary">Первая часть текста для добавления.</P>
<H4 class="parameter">text2</H4>
<P class="parametersummary">Вторая часть текста для добавления.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Полученный текст, содержащий обе указанные части.</P>
<H3 class="operation">Text.ConvertToLowerCase (text)</H3>
<P class="operationsummary">Конвертирует все символы указанного текста в нижний регистр.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст для преобразования в нижний регистр.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текст, преобразованный в нижний регистр.</P>
<H3 class="operation">Text.ConvertToUpperCase (text)</H3>
<P class="operationsummary">Конвертирует все символы указанного текста в верхний регистр.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст для преобразования в верхний регистр.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Текст, преобразованный в верхний регистр.</P>
<H3 class="operation">Text.EndsWith (text, subText)</H3>
<P class="operationsummary">Проверяет, заканчивается ли заданный текст указанным текстом.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, в котором надо осуществить поиск.</P>
<H4 class="parameter">subText</H4>
<P class="parametersummary">Подстрока для поиска.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Возвращает значение "True", если подстрока найдена в конце заданного текста.</P>
<H3 class="operation">Text.GetCharacter (characterCode)</H3>
<P class="operationsummary">Получает символ по его коду Юникод. В дальнейшем символ может быть использован в простом тексте.</P>
<H4 class="parameter">characterCode</H4>
<P class="parametersummary">Код в стандарте Юникод для нужного символа.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Символ, который соответствует заданному коду в стандарте Юникод.</P>
<H3 class="operation">Text.GetCharacterCode (character)</H3>
<P class="operationsummary">Получает код в стандарте Юникод  для указанного символа.</P>
<H4 class="parameter">character</H4>
<P class="parametersummary">Символ, для которого надо получить код в стандарте Юникод.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Код в стандарте Юникод для указанного символа.</P>
<H3 class="operation">Text.GetIndexOf (text, subText)</H3>
<P class="operationsummary">Находит позицию в тексте, с которой начинается указанная подстрока.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, в котором осуществляется поиск.</P>
<H4 class="parameter">subText</H4>
<P class="parametersummary">Текст, который надо найти.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Позиция в тексте, с которой начинается указанная подстрока. Если подстрока не найдена, возвращается значение 0.</P>
<H3 class="operation">Text.GetLength (text)</H3>
<P class="operationsummary">Получает длину указанного текста.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, длину которого надо вычислить.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Размер указанного текста.</P>
<H3 class="operation">Text.GetSubText (text, start, length)</H3>
<P class="operationsummary">Получает часть указанного текста.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, из которого надо извлечь подстроку.</P>
<H4 class="parameter">start</H4>
<P class="parametersummary">Указывает начальную позицию.</P>
<H4 class="parameter">length</H4>
<P class="parametersummary">Задает длину подстроки.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Запрошенная часть текста.</P>
<H3 class="operation">Text.GetSubTextToEnd (text, start)</H3>
<P class="operationsummary">Считывает подстроку из заданного текста, начиная с указанной позиции.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текст, из которого надо извлечь подстроку.</P>
<H4 class="parameter">start</H4>
<P class="parametersummary">Указывает начальную позицию.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Запрошенная подстрока.</P>
<H3 class="operation">Text.IsSubText (text, subText)</H3>
<P class="operationsummary">Проверяет, является ли указанный текст частью большего текста.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Текста, в котором будет искаться подстрока.</P>
<H4 class="parameter">subText</H4>
<P class="parametersummary">Подстрока для поиска.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Возвращает значение "True", если подстрока найдена в заданном тексте.</P>
<H3 class="operation">Text.StartsWith (text, subText)</H3>
<P class="operationsummary">Проверяет, начинается ли заданный текст определенным текстом.</P>
<H4 class="parameter">text</H4>
<P class="parametersummary">Размер текста для осуществления поиска.</P>
<H4 class="parameter">subText</H4>
<P class="parametersummary">Подстрока для поиска.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Возвращает значение "True", если подстрока найдена в начале заданного текста.</P>
<H2 class="object">Thread</H2>
<P class="objectsummary">Этот объект предназначен для работы с потоками. Поток представляет собой фрагмент программного кода, который может работать независимо и параллельно основной программе.<BR>Например, ты можешь создать поток, который будет управлять двигателями, в то время как основная программа будет опрашивать датчики или ожидать действий пользователя.<BR>Вообще говоря, многопоточность - сложная тема, не для начинающих. В ней стоит разобраться дополнительно.</P>
<H3 class="property">Thread.Run - Свойство</H3>
<P class="propertysummary">Запустить новый поток (параллельную задачу). Просто введите процедуру и она начнет выполняться в качестве независимого потока (пример: Thread.Run = MYSUB).<BR>Любая процедура может быть преобразована в независимы поток, однако одна процедура может быть преобразована в поток только однократно, два потока из нее сделать не удастся.<BR>При использовании Thread.Run в то время, как процедура уже работает, вызов потока поставится в очередь до тех пор, пока она не завершит свою работу. Это обеспечит корректную работу, но запуск потока вероятно может произойти позже запланированного.<BR>Все запущенные потоки остановятся, как только основная программа завершит свою работу.</P>
<H3 class="operation">Thread.CreateMutex ()</H3>
<P class="operationsummary">Создать мьютекс (сокр. от «mutual exclusion») - взаимное исключение, которое может быть использовано для синхронизации потоков.<BR>Мьютекс может быть только создан, но не удален. Лучше всего создать все необходимые мьютексы при старте программы и держать их номера в глобальных переменных.</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Идентификатор мьютекса. Будет использоваться в дальнейшем для блокировки и разблокировки</P>
<H3 class="operation">Thread.Lock (mutex)</H3>
<P class="operationsummary">Попытаться блокировать указанный мьютекс. Установка блокировки не позволит никакому другому потоку установить блокировку на него.<BR>			Если другой поток уже заблокировал мьютекс, текущий поток будет ждать, пока блокировка не будет снята, а затем сам заблокирует его (как только вызов функции закончится, то значит мьютекс был успешно заблокирован).<BR>			Этот механизм блокировки обычно используется для защиты некоторых структур данных или других ресурсов от использования двумя потоками одновременно. Каждый вызов блокировки должен быть сопряжен с вызовом последующей разблокировки.</P>
<H4 class="parameter">mutex</H4>
<P class="parametersummary">Идентификатор мьютекса (полученный от CreateMutex() )</P>
<H3 class="operation">Thread.Unlock (mutex)</H3>
<P class="operationsummary">Снять блокировку указанного мьютекса. Команду можно использовать только в случае, если блокировка действительно была ранее установлена.</P>
<H4 class="parameter">mutex</H4>
<P class="parametersummary">Идентификатор мьютекса (полученный от CreateMutex() )</P>
<H3 class="operation">Thread.Yield ()</H3>
<P class="operationsummary">Уступить процессор другому потоку. Команда дает знать другим потокам, что он простаивает и они могут более активно занимать ресурсы процессора.<BR>Часто потоки не выполняются параллельно, процессор переключается между потоками настолько быстро, что создается иллюзия параллельного выполнения.<BR>Если в потоке выполняется какое-то ожидание или бездействие, то эта команда может уступить управление процессором, чтобы другие потоки могли быстрее выполнить свою работу.</P>
<H2 class="object">Vector</H2>
<P class="objectsummary">Объект для выполнения операций над большим количеством чисел. Они называются векторами и будут храниться с использованием массивов с последовательными индексами (начиная с 0).<BR>В случае выполнений операций над массивами с различным числом элементов, недостающие элементы массивов будут рассматриваться кк элементы, содержащие 0.</P>
<H3 class="operation">Vector.Add (size, A, B)</H3>
<P class="operationsummary">Сложение двух векторов путем сложения соответствующих элементов (C[0]=A[0]+B[0], C[1]=A[1]+B[1]...)</P>
<H4 class="parameter">size</H4>
<P class="parametersummary">Количество элементов для сложения</P>
<H4 class="parameter">A</H4>
<P class="parametersummary">Первый вектор</P>
<H4 class="parameter">B</H4>
<P class="parametersummary">Второй вектор</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив, содержащий результат сложения</P>
<H3 class="operation">Vector.Data (size, data)</H3>
<P class="operationsummary">Создает вектор заданного размера и заполняет элементы данными, полученными из текста. Каждое число должно быть десятичным и разделяется пробелами.<BR>Например: V = Vector.Data(4, "47 11 8 15") создаст массив чисел с 4 значениями 47 11 8 15. (Первый индекс - 0)</P>
<H4 class="parameter">size</H4>
<P class="parametersummary">Размер создаваемого вектора</P>
<H4 class="parameter">data</H4>
<P class="parametersummary">Данные в текстовой форме, которые внесутся в массив. Если текст содержит недостаточно элементов, то введется 0, чтобы достичь указанного количества элементов</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Созданный вектор</P>
<H3 class="operation">Vector.Init (size, value)</H3>
<P class="operationsummary">Создать вектор заданного размера с указанным количеством элементов, содержащих одинаковое число.</P>
<H4 class="parameter">size</H4>
<P class="parametersummary">Размер вектора</P>
<H4 class="parameter">value</H4>
<P class="parametersummary">Значение, для всех элементов</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Созданный вектор</P>
<H3 class="operation">Vector.Multiply (rows, columns, k, A, B)</H3>
<P class="operationsummary">Операция умножения матриц.<BR>Входные вектора рассматриваются как двумерные матрицы заданной ширины и высоты. Отдельные строки матрицы хранятся в векторе непосредственно одна за другой.<BR>Чтобы узнать больше об этой математической операции, см. https://ru.wikipedia.org/wiki/Умножение_матриц</P>
<H4 class="parameter">rows</H4>
<P class="parametersummary">Количество строк в результирующей матрице</P>
<H4 class="parameter">columns</H4>
<P class="parametersummary">Количество столбцов в результирующей матрице</P>
<H4 class="parameter">k</H4>
<P class="parametersummary">Количество столбцов в исходной матрице А и количество строк в исходной матрице В</P>
<H4 class="parameter">A</H4>
<P class="parametersummary">Матрица А размера строк * k</P>
<H4 class="parameter">B</H4>
<P class="parametersummary">Матрица В размера k * столбцов</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Матрица, содержащая результаты умножения</P>
<H3 class="operation">Vector.Sort (size, A)</H3>
<P class="operationsummary">Сортировать элементы вектора в порядке возрастания.</P>
<H4 class="parameter">size</H4>
<P class="parametersummary">Количество элементов для сортировки</P>
<H4 class="parameter">A</H4>
<P class="parametersummary">Массив, содержащий элементы для сортировки</P>
<H4 class="returns">Возвращает</H4>
<P class="returnssummary">Массив, содержащий элементы в порядке возрастания значений</P>

<H1 class="chapter">Appendix - Sensors</H1>

<PRE>
Type  Mode  Name            get reading with   delivers 

1        0  NXT-TOUCH       ReadPercent        0=not pressed,  100=pressed  

4        0  NXT-COL-REF     ReadPercent        0=no reflective light, 100=maximum reflective light
4        1  NXT-COL-AMB     ReadPercent        0=no ambient light, 100=maximum ambient light
4        2  NXT-COL-COL     ReadRawValue       1=black, 2=blue, 3=green, 4=yellow, 5=red, 6=white

5        0  NXT-US-CM       ReadRawValue       distance in cm

16       0  TOUCH           ReadPercent        0=not pressed,  100=pressed  

29       0  COL-REFLECT     ReadPercent        0=no reflected light, 100=maximum reflected light
29       1  COL-AMBIENT     ReadPercent        0=no ambient light, 100=maximum ambient light
29       2  COL-COLOR       ReadRawValue       0=unknown, 1=black, 2=blue, 3=green, 4=yellow, 5=red, 6=white, 7=brown
29       4  RGB-RAW         ReadRaw (3 values) value0=red intensity, value1=green intensity, value2=blue intensity

30       0  US-DIST-CM      ReadRawValue       distance in mm
30       1  US-DIST-IN      ReadRawValue       distance in tenth of an inch

32       0  GYRO-ANG        ReadRawValue       angle in degrees
32       1  GYRO-RATE       ReadRawValue       rate of change of angle in deg/s

33       0  IR-PROX         ReadPercent        distance in cm (not very accurate)
33       1  IR-SEEK         ReadRaw (2 values) value0=direction and value1=distance to IR beacon
33       2  IR-REMOTE       ReadRaw (4 values) value0=signal from channel 1 (*), value1=signal from channel 2...
                                    a remote control sender can be switched to use one of 4 channels 
                                    (slider on top position is channel 1) and the remote receiver can detect 
                                    all channel signals at the same time
                                               											       
(*) numbers for the remote control buttons (A=left top, B=left bottom, C=right top, D=right bottom, E=beacon activated):
	A = 1    A & B = 10   B & C = 7
	B = 2    A & C = 5    B & D = 8
	C = 3    A & D = 6    C & D = 11
	D = 4                 E = 9
   other combinations give a reading of 0
</PRE>   

<H1 class="chapter">Appendix - I2C Tutorial</H1>
<H3 class="subchapter">Why access I2C directly?</H3>
<P>
Normally interfacing to sensors from the EV3 brick is done using the easy-to-use Sensor.Read... commands. 
But some third-party devices are not compatible with the default sensor protocol and require extra programming. 
The vendors of such devices normally provide some programming blocks for the original graphics programming 
environment that handle all the details of the communication. 
</P>
<P>
For EV3Basic there is probably no such support available, but normally there is some documentation specifying 
the low-level communication protocol. Having this information, the Sensor.CommunicateI2C or one of the other
I2C related commands can be used to implement any such protocol.
</P>
<H3 class="subchapter">Introduction to I2C</H3>
<P>
I2C is a communication facility that allows a single master to access multiple slaves on a common bus
for reading and writing data. In the case of the EV3 each sensor port with its attached sensor device(s)
can form such a bus. 
</P>
<P>
The communication is done by the master sending a bunch of data bytes to a slave or by requesting
a bunch of data bytes. The slaves themselves cannot initiate any data transfer. Because there can be multiple 
slaves connected to the bus, the master needs to make clear to which slave it wants to talk. This is done by 
sending a slave address (a number from 0 to 127) before communication. The designer of the system must 
make sure that no two slaves on a bus have the same address to avoid conflict.
</P>
<P>
The I2C protocol itself only provides a means for communication, the meaning of the data totally depends on the devices in question. 
</P>
<H3 class="subchapter">CommunicateI2C</H3>
<P>
This command of EV3Basic is the only way to access the I2C functionality directly in a raw form.
It combines the operation of sending an arbitrary number of bytes and receiving some bytes back. 
Example:
</P>
<pre>
W[0]=60
W[1]=70
W[2]=80
R=Sensor.CommunicateI2C(1,44,3,4,W)
</pre>
<P>
This will first send the bytes 60,70,80 to the slave with address 44 that is connected to sensor port 1.
Then it will fetch 4 bytes from the same slave. The received bytes are stored in the array R.
</P>
<H3 class="subchapter">I2C Registers</H3>
<p>
The concept of registers is basically not part of the I2C protocol, but this concept is used
so widely, that it is now a kind of standard way to do communication with many devices.
On devices that use registers, all data transfer is done by the master writing 
into the slave's registers or reading data from the registers. A register is basically just 
a storage location that can hold one byte of data and is accessed via its register number
(or register 'address' - but using this name will probably lead to confusion because the slaves
themselves already have an I2C-address).
</p>
<P>
Since version 1.2.5, EV3Basic directly provides support for reading/writing 
from/to registers of I2C devices that follow the register standard.
</P>
<H3 class="subchapter">Sources of confusion</H3>
<P>
Slave address vs. Register address.<br>
Many device documents refer to the slave address and the register number both just as 'address'.
Make sure to understand the difference and what the documentation really means in each case.
</P>
<P>
Slave address is pre-multiplied by 2<br>
The inner working of the protocol combines the 7 bits of the slave address (values from 0 to 127) with
a single bit that specifies the direction (read or write) to give 8 bits that need to be transmitted from master to slave.
Sometimes the developers of a device just write this combined value into the program to save a few processor cycles
during execution. When this value finds is way into the documentation, a slave address of for example 80 will 
be written 160 there. It is sometimes quite hard to figure out what the real address is. If in doubt, you need to 
write a test program to check if a slave address is valid.
</P>

<H1 class="chapter">Appendix - Advanced logic operations</H1>
<H3 class="subchapter">Motivation</H3>
<P>
In Small Basic (and indeed in any dialect of Basic, I have encountered) the use of comparators and of the 
logic operators AND and OR is limited to the context of If and While. But sometimes it is necessary 
to keep the outcome of a comparison for future use. For this you have to write something like
</P>
<pre>
If X<10 OR X>50 Then
   A = "True"
Else
   A = "False"
EndIf
</pre>
<P>
But knowing other programming languages you would probably very much prefer to write this in a single line
like
</P>
<pre>
A = X<10 OR X>50
</pre>
<P>
which is not possible in Small Basic. 
</P>
<P>
But using the Byte.ToLogic command, there is a funky way to indeed do the same thing also in one line. 
Please read on.
</P>
<H3 class="subchapter">Comparators outside If and While</H3>
<P>
When reading the specification for the Byte.ToLogic commands carefully you can see that it will 
return "True" for positive input values and "False" for 0 or negative. 
So consider the following construct.
</P>
<pre>
A = Byte.ToLogic(X-Y)
</pre>
<P>
This will actually set A to "True" whenever X is greater than Y just like a non-existent 
greater-than comparison expression would. Similarly the construct 
</P>
<pre>
A = Byte.ToLogic(Math.Abs(X-Y))
</pre>
<P>
is equivalent to a non-equal operator. Using this idea you can create all possible comparison
expressions of Small Basic (some are quite simple to write, others are more complicated)
<pre>
  X > Y              Byte.ToLogic(X-Y)
  X < Y              Byte.ToLogic(Y-X)
  X >= Y             Byte.ToLogic(1+Math.Floor(X-Y))
  Y <= X             Byte.ToLogic(1+Math.Floor(Y-X))
  X &lt;&gt; Y             Byte.ToLogic(Math.Abs(X-Y))
  X = Y              Byte.ToLogic(1-Math.Ceiling(Math.Abs(X-Y)))
</pre>
<H3 class="subchapter">Putting comparators together</H3>
<P>
To allow a logic combination of comparators (just like the motivating example), you can
actually use the Math.Max and Math.Min commands to do proper AND and OR of the comparator outcomes.
Consider the following example:
</P>
<pre>
A = Byte.ToLogic(Math.Max(10-X,X-50))
</pre>
<P>
The first parameter of the Max will be greater than zero whenever X is lower than 10. 
The second parameter of the Max will be greater than zero whenever X is higher than 50.
The outcome of the Max command will be greater than zero whenever one of its parameters is greater than zero.
By turning this "greater-than-zero" property into an explicit logic value of "True" or "False"  
with the Byte.ToLogic command, this is now totally equivalent to the non-existing construct:
</P>
<pre>
A = X<10 OR X>50
</pre>
<P> 
all done in one single line.
Here is a summary of logic operators (including NOT for good measure):
</P>
<pre>
  A AND B                Math.Min(A,B)
  A OR B                 Math.Max(A,B)
  NOT A                  (1-Math.Ceiling(A))
</pre>


</BODY>
</HTML>
